home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / PROGRAMM / ASSEMBLE / H145.ZIP / ASXXXX_3.ZIP / M04MCH.C < prev    next >
C/C++ Source or Header  |  1990-07-18  |  4KB  |  245 lines

  1. /* m04mch.c */
  2.  
  3. /*
  4.  * (C) Copyright 1989,1990
  5.  * All Rights Reserved
  6.  *
  7.  * Alan R. Baldwin
  8.  * 721 Berkeley St.
  9.  * Kent, Ohio  44240
  10.  */
  11.  
  12. #include <stdio.h>
  13. #include <setjmp.h>
  14. #include "asm.h"
  15. #include "m6804.h"
  16.  
  17. /*
  18.  * Process a machine op.
  19.  */
  20. VOID
  21. machine(mp)
  22. struct mne *mp;
  23. {
  24.     register op, t1, t2, type;
  25.     struct expr e1, e2, e3;
  26.     struct area *espa;
  27.     int c, v1, v2, v3;
  28.     char id[NCPS];
  29.  
  30.     op = mp->m_valu;
  31.     type = mp->m_type;
  32.     switch (type) {
  33.  
  34.     case S_SDP:
  35.         e1.e_mode = 0;
  36.         e1.e_flag = 0;
  37.         e1.e_addr = 0;
  38.         e1.e_base.e_ap = NULL;
  39.         espa = NULL;
  40.         if (more()) {
  41.             expr(&e1, 0);
  42.             if (e1.e_flag == 0 && e1.e_base.e_ap == NULL) {
  43.                 if (e1.e_addr) {
  44.                     err('b');
  45.                 }
  46.             }
  47.             if ((c = getnb()) == ',') {
  48.                 getid(id, -1);
  49.                 espa = alookup(id);
  50.                 if (espa == NULL) {
  51.                     err('u');
  52.                 }
  53.             } else {
  54.                 unget(c);
  55.             }
  56.         }
  57.         if (espa) {
  58.             outdp(espa, &e1);
  59.         } else {
  60.             outdp(dot.s_area, &e1);
  61.         }
  62.         lmode = SLIST;
  63.         break;
  64.  
  65.     case S_INH:
  66.         outab(op);
  67.         break;
  68.  
  69.     case S_BRA:
  70.         expr(&e1, 0);
  71.         v1 = e1.e_addr - dot.s_addr - 1;
  72.         if ((v1 < -16) || (v1 > 15))
  73.             aerr();
  74.         if (e1.e_base.e_ap != dot.s_area)
  75.             rerr();
  76.         outab(op | v1&0x1F);
  77.         break;
  78.  
  79.     case S_TYP1:
  80.         expr(&e1, 0);
  81.         v1 = e1.e_addr;
  82.         if ((v1 < -4096) || (v1 > 4095))
  83.             aerr();
  84.         e1.e_addr += op;
  85.         outrw(&e1, 0);
  86.         break;
  87.  
  88.     case S_TYP2:
  89.     case S_TYP3:
  90.         t1 = addr(&e1);
  91.         if (type == S_TYP3 & t1 == S_IMMED) {
  92.             outab(op|0x08);
  93.             outrb(&e1, 0);
  94.             break;
  95.         }
  96.         if (t1 == S_DIR) {
  97.             v1 = e1.e_addr;
  98.             if ((e1.e_base.e_ap == NULL) &
  99.                 v1 >= 0x80 & v1 <= 0x83) {
  100.                 v1 &= 0x03;
  101.                 if (op == 0xE0) {
  102.                     outab(0xAC | v1);
  103.                     break;
  104.                 }
  105.                 if (op == 0xE1) {
  106.                     outab(0xBC | v1);
  107.                     break;
  108.                 }
  109.                 if (op == 0xE6) {
  110.                     outab(0xA8 | v1);
  111.                     break;
  112.                 }
  113.                 if (op == 0xE7) {
  114.                     outab(0xB8 | v1);
  115.                     break;
  116.                 }
  117.             }
  118.             outab(op|0x18);
  119.             outrb(&e1, R_PAG0);
  120.             break;
  121.         }
  122.         if (t1 == S_IX) {
  123.             outab(op);
  124.             break;
  125.         }
  126.         if (t1 == S_IY) {
  127.             outab(op|0x10);
  128.             break;
  129.         }
  130.         aerr();
  131.         break;
  132.  
  133.     case S_CLR:
  134.         outab(0xB0);
  135.         outab(op);
  136.         outab(0x00);
  137.         break;
  138.  
  139.     case S_LD:
  140.         t1 = addr(&e1);
  141.         if (t1 == S_IMMED) {
  142.             outab(0xB0);
  143.             outab(op);
  144.             outrb(&e1, 0);
  145.             break;
  146.         }
  147.         aerr();
  148.         break;
  149.  
  150.     case S_MVI:
  151.         t1 = addr(&e1);
  152.         if (t1 != S_DIR)
  153.             aerr();
  154.         comma();
  155.         t2 = addr(&e2);
  156.         if (t2 != S_IMMED)
  157.             aerr();
  158.         outab(op);
  159.         outrb(&e1, 0);
  160.         outrb(&e2, 0);
  161.         break;
  162.  
  163.     case S_APOST:
  164.         outab(op);
  165.         outab(0xFF);
  166.         break;
  167.  
  168.     case S_BPM:
  169.     case S_BXPM:
  170.     case S_BYPM:
  171.         expr(&e2, 0);
  172.         outab(op);
  173.         if (type == S_BPM)
  174.             v1 = 0xFF;
  175.         if (type == S_BXPM)
  176.             v1 = 0x80;
  177.         if (type == S_BYPM)
  178.             v1 = 0x81;
  179.         outab(v1);
  180.         if (e2.e_base.e_ap == NULL || e2.e_base.e_ap == dot.s_area) {
  181.             v2 = e2.e_addr - dot.s_addr - 1;
  182.             if ((v2 < -128) || (v2 > 127))
  183.                 aerr();
  184.             outab(v2);
  185.         } else {
  186.             outrb(&e2, R_PCR);
  187.         }
  188.         if (e2.e_mode != S_USER)
  189.             rerr();
  190.         break;
  191.  
  192.     case S_BTB:
  193.     case S_BSC:
  194.         t1 = addr(&e1);
  195.         if (t1 != S_IMMED || e1.e_addr & ~0x07)
  196.             aerr();
  197.         comma();
  198.         t2 = addr(&e2);
  199.         if (t2 != S_DIR)
  200.             aerr();
  201.         if (type == S_BTB) {
  202.             comma();
  203.             expr(&e3, 0);
  204.         }
  205.         outab(op + (e1.e_addr & 0x07));
  206.         outrb(&e2, R_USGN);
  207.         if (type == S_BTB) {
  208.             if (e3.e_base.e_ap == NULL || e3.e_base.e_ap == dot.s_area) {
  209.                 v3 = e3.e_addr - dot.s_addr - 1;
  210.                 if ((v3 < -128) || (v3 > 127))
  211.                     aerr();
  212.                 outab(v3);
  213.             } else {
  214.                 outrb(&e3, R_PCR);
  215.             }
  216.             if (e3.e_mode != S_USER)
  217.                 rerr();
  218.         }
  219.         break;
  220.  
  221.     default:
  222.         err('o');
  223.     }
  224. }
  225.  
  226.  
  227. /*
  228.  * The next character must be a
  229.  * comma.
  230.  */
  231. VOID
  232. comma()
  233. {
  234.     if (getnb() != ',')
  235.         qerr();
  236. }
  237.  
  238. /*
  239.  * Machine specific initialization.
  240.  */
  241. VOID
  242. minit()
  243. {
  244. }
  245.